package com.linkai.JUC._15_single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Description: Enum 枚举是JDK1.5出来的，自带单例模式
 *                枚举不能被反射破坏
 *               enum 是一个什么？本身也是一个 Class 类
 * @Author: 林凯
 * @Date: 2021/10/26 13:22
 */
public enum  _04_EnumSingle {
    INSTANCE;

    public _04_EnumSingle getInstance() {
        return INSTANCE;
    }
}

class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        _04_EnumSingle instance1 = _04_EnumSingle.INSTANCE;
        _04_EnumSingle instance2 = _04_EnumSingle.INSTANCE;

        /*
            实际上 Enum 里面没有无参构造，会报 java.lang.NoSuchMethodException 异常
            但是通过查看 .class 文件或者将 .class 文件反编译成为 java 文件，都显示存在无参构造
            最终使用 jad 把源码变成 java 文件，就会显示没有无参构造，存在一个有参构造
        * */
//        Constructor<_04_EnumSingle> declaredConstructor = _04_EnumSingle.class.getDeclaredConstructor(null);

        /*
           Enum里面是有一个有参构造的，获取这个有参构造器，然后通过反射修改
           就会抛出：
           java.lang.IllegalArgumentException: Cannot reflectively create enum objects
           这个异常和 newInstance() 源码里面显示的异常是一致的

        * */
        Constructor<_04_EnumSingle> declaredConstructor = _04_EnumSingle.class.getDeclaredConstructor(String.class, int.class);
        declaredConstructor.setAccessible(true);
        _04_EnumSingle instance3 = declaredConstructor.newInstance();

        System.out.println(instance1);
        System.out.println(instance2);
        /*
            java.lang.NoSuchMethodException 没有无参构造方法？
            但是查看 .class 文件，里面是有无参构造方法的
        * */
        System.out.println(instance3);
    }
}
